package com.itic.hpp.wx;

import java.util.HashMap;
import java.util.Map;

import com.itic.appbase.framework.utils.AesCbcUtil;
import com.itic.appbase.framework.utils.WXPay.StringUtils;
import com.itic.mobile.base.BaseMobile;
import com.itic.system.user.user.service.HppUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.itic.appbase.framework.utils.HttpRequestUtils;

import net.sf.json.JSONObject;


@Controller
@RequestMapping(value = "/hpp/UserInfo")
public class DecodeUserInfo extends BaseMobile {
	
	@Autowired
	private HppUserService hppUserService ;
	
	/**
	 * 解析用户信息
	 * @author 王文鑫  
	 * @date 2018年5月31日  
	 * @param encryptedData
	 * @param iv
	 * @param code
	 * @param Appid
	 * @param Secret
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/decodeUserInfo",method = RequestMethod.POST)
	public Map DecodeUserInfo11(String encryptedData, String iv, String code,String Appid,String Secret) {

	    Map map = new HashMap();
	    //登录凭证不能为空
	    if (code == null || code.length() == 0) {
	        map.put("status", 0);
	        map.put("msg", "code 不能为空");
	        return map;
	    }
		map.put("encryptedData", encryptedData);
		map.put("code", code);
		map.put("iv", iv);
		map.put("Appid", Appid);
		map.put("Secret", Secret);

	    //小程序唯一标识   (在微信小程序管理后台获取)
	    String wxspAppid = Appid;
	    //小程序的 app secret (在微信小程序管理后台获取)
	    String wxspSecret = Secret;
	    //授权（必填）
	    String grant_type = "authorization_code";

	    //////////////// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid ////////////////
	    //请求参数
	    String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;

		map.put("params", params);
	    //发送请求
	    String sr = HttpRequestUtils.httpGet("https://api.weixin.qq.com/sns/jscode2session?appid="+ wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type);
	    //解析相应内容（转换成json对象）
	    JSONObject json = JSONObject.fromObject(sr);
	    //获取会话密钥（session_key）
	    String session_key = json.get("session_key").toString();
		map.put("json", json);
	    
	    //用户的唯一标识（openid）
	    String openid = (String) json.get("openid");

	    //////////////// 2、对encryptedData加密数据进行AES解密 ////////////////
	    try {
	        String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
			map.put("result", result);
			if (null != result && result.length() > 0) {
	            map.put("status", 1);
	            map.put("msg", "解密成功");

	            JSONObject userInfoJSON = JSONObject.fromObject(result);
	            Map userInfo = new HashMap();
	            
	            String openId = (String) userInfoJSON.get("openId");
	            
	            System.out.println(openId);
	            
	            userInfo.put("session_key", session_key);
	            userInfo.put("openId", userInfoJSON.get("openId"));
	            
	            String phone = hppUserService.getUserPhoneByOpenId(openId);
	            
	            userInfo.put("phone", phone);
	            userInfo.put("nickName", userInfoJSON.get("nickName"));
	            userInfo.put("gender", userInfoJSON.get("gender"));
	            userInfo.put("city", userInfoJSON.get("city"));
	            userInfo.put("province", userInfoJSON.get("province"));
	            userInfo.put("country", userInfoJSON.get("country"));
	            userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));
	            userInfo.put("unionId", userInfoJSON.get("unionId"));
	            map.put("userInfo", userInfo);
	            return map;
	        }
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
	    map.put("status", 0);
	    map.put("msg", "解密失败");
	    return map;
	}
	
	/**
	 * 解析用户手机号
	 * @author 王文鑫  
	 * @date 2018年5月31日  
	 * @param encryptedData
	 * @param iv
	 * @param code
	 * @param Appid
	 * @param Secret
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/decodePhoneNumber",method = RequestMethod.POST)
	public Map decodePhoneNumber(String encryptedData, String iv, String code,String Appid,String Secret) {

	    Map map = new HashMap();

	    //登录凭证不能为空
	    if (code == null || code.length() == 0) {
	        map.put("status", 0);
	        map.put("msg", "code 不能为空");
	        return map;
	    }

	    //小程序唯一标识   (在微信小程序管理后台获取)
	    String wxspAppid = Appid;
	    //小程序的 app secret (在微信小程序管理后台获取)
	    String wxspSecret = Secret;
	    //授权（必填）
	    String grant_type = "authorization_code";

	    //////////////// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid ////////////////
	    //请求参数
	    String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
	    
	    //发送请求
	    String sr = HttpRequestUtils.httpGet("https://api.weixin.qq.com/sns/jscode2session?appid="+ wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type);
	    //解析相应内容（转换成json对象）
	    JSONObject json = JSONObject.fromObject(sr);
	    //获取会话密钥（session_key）
	    String session_key = json.get("session_key").toString();
	    
	    
	    //用户的唯一标识（openid）
	    String openid = (String) json.get("openid");

	    //////////////// 2、对encryptedData加密数据进行AES解密 ////////////////
	    try {
	        String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
	        if (null != result && result.length() > 0) {
	            map.put("status", 1);
	            map.put("msg", "解密成功");

	            JSONObject userInfoJSON = JSONObject.fromObject(result);
	            Map PhoneNumber = new HashMap();
	            
	            PhoneNumber.put("session_key", session_key);
	            PhoneNumber.put("phoneNumber", userInfoJSON.get("phoneNumber"));
	            PhoneNumber.put("purePhoneNumber", userInfoJSON.get("purePhoneNumber"));
	            PhoneNumber.put("countryCode", userInfoJSON.get("countryCode"));
	            PhoneNumber.put("watermark", userInfoJSON.get("watermark"));
	            
	            map.put("userInfo", PhoneNumber);
	            return map;
	        }
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
	    map.put("status", 0);
	    map.put("msg", "解密失败");
	    return map;
	}
}


